#include <iostream>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <cstdio>
#include <signal.h>

void printPending(sigset_t &pending)
{
    std::cout << "cur process: pid: " << getpid() << "pending: ";
    for(int subofsig = 31; subofsig >= 1; subofsig--)
    {
        if (sigismember(&pending, subofsig))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << "\n";
}

void handler(int sig)
{
    std::cout << sig << " 号信号被递达！" << std::endl;
}

int main()
{
    signal(2, handler);
    //  1. 屏蔽2号信号 
    sigset_t block_set, old_set;
    sigemptyset(&block_set);
    sigemptyset(&old_set);
    sigaddset(&block_set, SIGINT);

    //  1.1 设置进入进程的block表中
    sigprocmask(SIG_BLOCK, &block_set, &old_set);

    int cnt = 10;
    while (true)
    {
        //  2. 获取当前进程的pending信号集
        sigset_t pending;
        sigpending(&pending);

        //  3. 打印pending信号集
        printPending(pending);

        //  4. 解除对2号信号的屏蔽
        cnt--;
        if (cnt == 0)
        {
            std::cout << "解除对2号信号的屏蔽" << std::endl;
            sigprocmask(SIG_SETMASK, &old_set, &block_set);
        }

        sleep(1);
    }
    

    return 0;
}


// struct bits
// {
//     uint32_t bits[400];
// };

// int main()
// {
//     sigset_t bits;
//     return 0;
// }

// int sum(int start, int end)
// {
//     int ret = 0;
//     for (size_t i = start; i <= end; i++)
//     {
//         ret /= 0;
//         ret += i;
//     }
//     return ret;
// }

// int main()
// {
//     // int total = sum(0, 100);
//     // std::cout << "total: " << total << std::endl;
//     pid_t id = fork();
//     if (id == 0)
//     {
//         sleep(1);
//         //child
//         sum(0, 100);
//         exit(0);
//     }
//     //father
//     int status = 0;
//     pid_t rid = waitpid(id, &status, 0);
//     if (rid == id)
//     {
//         printf("exit code: %d, exit signal: %d, core dump: %d\n", (status>>8) & 0xFF, status & 0x7F, (status>>7) & 0x1);
//     }
    

//     return 0;
// }
